package com.weizhizs.assistant.code.template.data;

import com.weizhizs.assistant.code.config.ParamConfig;
import com.weizhizs.assistant.code.helper.TableHelper;
import com.weizhizs.assistant.code.template.IDataLoador;
import com.weizhizs.assistant.code.vo.ColumnVO;
import com.weizhizs.assistant.code.vo.TableVO;
import com.weizhizs.assistant.utils.DateUtils;
import com.weizhizs.assistant.utils.StringUtils;

import java.io.File;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class MapperData implements IDataLoador {

    @Override
    public String getTemplateName(TableVO tableVO) {
        if (TableVO.TABLE_TYPE_DEL == tableVO.getTableType()) {
            return ParamConfig.getInstance().getTemplatePath() + "/mapper4del.xml.vm";
        } else {
            return ParamConfig.getInstance().getTemplatePath() + "/mapper.xml.vm";
        }
    }

    @Override
    public String getFileOutPath() {
        return "";
    }

    @Override
    public String getFileName(String tableName) {
        return "mapper" + File.separator + TableHelper.tableNameToClassName(tableName) + "Mapper.xml";
    }

    @Override
    public Map<String, Object> getDataMap(TableVO tableVO) {
        String tableName = tableVO.getTableName();

        //封装模板数据
        String clazzName = TableHelper.tableNameToClassName(tableName);
        String instanceName = StringUtils.firstToLowerCase(clazzName);

        Map<String, Object> map = new HashMap<>();
        map.put("tableName", tableName);
        map.put("tableComment", tableVO.readTableComment());
        map.put("tableCommentFull", tableVO.getTableComment());
        map.put("authorName", ParamConfig.getInstance().getAuthorName());
        map.put("version", ParamConfig.getInstance().getVersion());
        map.put("currentDate", DateUtils.nowDateString());
        map.put("pk", tableVO.getPk());
        map.put("allColumns", tableVO.getAllColumns());

        if (haveSortNoField(tableVO)) {
            map.put("orderByName", "sort_no");
        } else {
            if ("desc".equals(ParamConfig.getInstance().getDefaultOrderMode())) {
                map.put("orderByName", tableVO.getPk().getColumnName() + " desc");
            } else {
                map.put("orderByName", tableVO.getPk().getColumnName());
            }
        }

        map.put("entityLocalFields", Arrays.asList(ParamConfig.getInstance().getEntityLocalFields()));
        map.put("filterInsertFields", Arrays.asList(ParamConfig.getInstance().getFilterInsertFields()));
        map.put("filterUpdateFields", Arrays.asList(ParamConfig.getInstance().getFilterUpdateFields()));

        map.put("resultMapName", instanceName + "Map");
        map.put("daoFullClassName", ParamConfig.getInstance().getDaoOutPath() + "." + clazzName + "Dao");
        map.put("dtoFullClassName",  ParamConfig.getInstance().getDtoOutPath() + "." + clazzName + "DTO");

        return map;
    }

    private boolean haveSortNoField(TableVO tableVO) {
        for (ColumnVO column : tableVO.getAllColumns()) {
            if ("sort_no".equalsIgnoreCase(column.getColumnName())) {
                return true;
            }
        }
        return false;
    }

}
